/* 
泛型约束
*/
(() => {

  /* 
  定义一个带length属性的接口
  */
  interface Lengthable {
    length: number
  }

  // 得到指定参数对象的length属性值, x的类型不确定
  // 问题: 一个泛型默认是没有任何属性和方法
  // 如何让一个泛型能有特定属性或方法?
  // 使用泛型约束: 让一个泛型去继承一个接口(在接口中定义泛型需要的属性或方法)
  // 问题: 泛型是什么类型 是一种特别的接口
  function getLength<T extends Lengthable>(x: T): number {
    return x.length
  }

  console.log(getLength('abc')) // 3
  console.log(getLength([1, 2, 3, 4])) // 4
  // console.log(getLength(123)) // error number没有length

})()